//
// Created by 高森森 on 2022/10/12.
//

#ifndef LEETCODE_SOLUTION_22_H
#define LEETCODE_SOLUTION_22_H
#include<bits/stdc++.h>
using namespace std;

const int direction[2][2]={{-1,1},{1,-1}};

class solution_22 {
public:
    vector<int>result;
    vector<int> findDiagonalOrder(vector<vector<int>>& mat) {
        int x,y,nx,ny;
        int flag=0;
        x=0;
        y=0;
        int row=mat.size();
        int col=mat[0].size();
        while(result.size()!=mat.size()*mat[0].size()){
            result.push_back(mat[x][y]);
            nx=x+direction[flag][0];
            ny=y+direction[flag][1];

            if(nx>=row||nx<0||ny>=col||ny<0){
                if(flag==0){
                    //如果flag=0是向右移动，但是同时注意若移动到最右边即y+1>=m，应该向下移动
                    nx=y+1<mat[0].size()?x:x+1;
                    ny=y+1<mat[0].size()?y+1:y;
                }else{
                    //如果flag=1是向下移动，但是同时注意若移动到最下边即x+1>=m，应该向右移动
                    nx=x+1<mat.size()?x+1:x;
                    ny=x+1<mat.size()?y:y+1;
                }
                flag=(flag+1)%2;
            }
            x=nx;
            y=ny;
        }
        return result;
    }

};


#endif //LEETCODE_SOLUTION_22_H
